package mysort;

public class a06_QuickSortDemo1 {
    public static void main(String[] args) {
        /*
            快速排序：
                    第一轮以0索引为基准数，确定基准数在数组中的正确位置
                    比基准数小的都在左边，比基准数大的都在右边
                    后边以次类推
            0索引移动时先移动end后移动start
            arr.length索引移动时先移动start后移动end
        */

        int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};

        quickSort(arr,0, arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }

    }

    public static void quickSort(int[] arr, int i, int j) {
        //定义两个变量记录要查找的范围
        int start = i;
        int end = j;

        if (start>end){
            //递归的出口
            return ;
        }

        //记录基准数
        int baseNum = arr[i];

        //利用循环找要交换的数字
        while (start != end) {
            //利用end，从后往前找比基准数小的数字
            while(true){
                if (end <= start || arr[end]<baseNum){
                    break;
                }
                end--;
            }

            //利用start，从前往后找比基准数大的数字
            while(true){
                if (end <= start || arr[start]>baseNum){
                    break;
                }
                start++;
            }

            //交换end和start只想的元素
            int temp = arr[end];
            arr[end] = arr[start];
            arr[start] = temp;
        }
        //基准数归位
        int temp = arr[i];
        arr[i] = arr[start];
        arr[start] = temp;

        //确定6左边的范围重复
        quickSort(arr,i,start-1);
        //确定6右边的范围重复
        quickSort(arr,start+1, j);

    }

}
